package model.dominio;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.SortedMap;
import model.dao.DaoCliente;
import model.dao.DaoVeiculo;
import utilitario.ManipularArquivo;
import utilitario.ValidaException;

public class Locacao {

    private Long kmSaida;
    private Long kmEntrada;
    private double valorLocacao;
    private Date dataSaida;
    private Date dataDevolucao;
    private Integer previsaoDias;
    private Veiculo veiculo;
    private Cliente cliente;
    private int codigo = 0;
    private int tipoLocacao;
    private ArrayList<Motorista> motoristas;

    public Locacao() {
        this.motoristas = new ArrayList<Motorista>();
        this.cliente = new Cliente(null, null);
        this.veiculo = new Veiculo(null, null, null);
    }

    /**
     * @return the kmSaida
     */
    public Long getKmSaida() {
        return kmSaida;
    }

    /**
     * @param kmSaida the kmSaida to set
     */
    public void setKmSaida(Long kmSaida) {
        this.kmSaida = kmSaida;
    }

    /**
     * @return the kmEntrada
     */
    public Long getKmEntrada() {
        return kmEntrada;
    }

    /**
     * @param kmEntrada the kmEntrada to set
     */
    public void setKmEntrada(Long kmEntrada) {
        this.kmEntrada = kmEntrada;
    }

    /**
     * @return the valorLocacao
     */
    public double getValorLocacao() {
        return valorLocacao;
    }

    /**
     * @param valorLocacao the valorLocacao to set
     */
    public void setValorLocacao(double valorLocacao) {
        this.valorLocacao = valorLocacao;
    }

    /**
     * @return the dataSaida
     */
    public Date getDataSaida() {
        return dataSaida;
    }

    /**
     * @param dataSaida the dataSaida to set
     */
    public void setDataSaida(String dataSaida) {
        try {
            String aux[] = dataSaida.split(" ");
            dataSaida = aux[0];
            this.dataSaida = new Date(Integer.parseInt(dataSaida.substring(6, 10)) - 1900, Integer.parseInt(dataSaida.substring(3, 5)) - 1, Integer.parseInt(dataSaida.substring(0, 2)));
        } catch (Exception e) {
            dataSaida = null;
        }
    }

    /**
     * @return the dataDevolucao
     */
    public Date getDataDevolucao() {
        return dataDevolucao;
    }

    /**
     * @return the dataDevolucao
     */
    public int getDiferencaDiasDevolucao() {
        final long MILISSECONDS_PER_DAY = 24 * 60 * 60 * 1000;
        int diff = Integer.parseInt(((dataDevolucao.getTime() - dataSaida.getTime()) / MILISSECONDS_PER_DAY) + "");
        if (diff == 0) {
            return 1;
        }
        return diff;
    }

    /**
     * @return the dataDevolucao
     */
    public long getKmRodados() {
        return kmEntrada - kmSaida;
    }

    /**
     * @param dataDevolucao the dataDevolucao to set
     */
    public void setDataDevolucao(String dataDevolucao) {
        try {
            String aux[] = dataDevolucao.split(" ");
            dataDevolucao = aux[0];
            this.dataDevolucao = new Date(Integer.parseInt(dataDevolucao.substring(6, 10)) - 1900, Integer.parseInt(dataDevolucao.substring(3, 5)) - 1, Integer.parseInt(dataDevolucao.substring(0, 2)));
        } catch (Exception e) {
            dataSaida = null;
        }
    }

    /**
     * @return the previsaoDias
     */
    public Integer getPrevisaoDias() {
        return previsaoDias;
    }

    /**
     * @param previsaoDias the previsaoDias to set
     */
    public void setPrevisaoDias(Integer previsaoDias) {
        this.previsaoDias = previsaoDias;
    }

    /**
     * @return the veiculo
     */
    public Veiculo getVeiculo() {
        return veiculo;
    }

    /**
     * @param veiculo the veiculo to set
     */
    public void setVeiculo(Veiculo veiculo) {
        this.veiculo = veiculo;
    }

    /**
     * @return the cliente
     */
    public Cliente getCliente() {
        return cliente;
    }

    /**
     * @param cliente the cliente to set
     */
    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    /**
     * @return the codigo
     */
    public int getCodigo() {
        return codigo;
    }

    /**
     * @param codigo the codigo to set
     */
    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    /**
     * @return the tipoLocacao
     */
    public int getTipoLocacao() {
        return tipoLocacao;
    }

    /**
     * @return the motoristas
     */
    public ArrayList<Motorista> getMotoristas() {
        return motoristas;
    }

    /**
     * @param tipoLocacao the tipoLocacao to set
     */
    public void addMotorista(Motorista motorista) {
        motoristas.add(motorista);
    }

    private String getCodigosMotoristas() {
        String x = "<";
        for (int i = 0; i < this.motoristas.size(); i++) {
            x += this.motoristas.get(i).getCodigo();
            if (i + 1 < this.motoristas.size()) {
                x += ",";
            }
        }
        x += ">";
        return x;
    }

    public String toString() {
        String x = "";
        if (this.getCodigo() > 0) {
            x += "<codigo=" + String.format("%06d", this.codigo) + ">,";
        }
        x += "<kmSaida=" + this.kmSaida + ">,<kmEntrada=" + this.kmEntrada + ">,<previsaoDias=" + this.previsaoDias + ">,<cliente=" + this.cliente.getCodigo() + ">,<veiculo=" + this.veiculo.getCodigo() + ">,<tipoLocacao=" + this.getTipoLocacao() + ">,<motoristas=" + this.getCodigosMotoristas() + ">,<valorLocacao=" + this.getValorLocacao() + ">";
        if (dataSaida != null) {
            x += ",<dataSaida=" + this.dataSaida.toLocaleString() + ">";
        } else {
            x += ",<dataSaida=null>";
        }
        if (dataDevolucao != null) {
            x += ",<dataDevolucao=" + this.dataDevolucao.toLocaleString() + ">";
        } else {
            x += ",<dataDevolucao=null>";
        }
        return x;

    }

    /**
     * @param tipoLocacao the tipoLocacao to set
     */
    public void setTipoLocacao(int tipoLocacao) {
        this.tipoLocacao = tipoLocacao;
    }

    public static Locacao stringToObject(String dados) throws ValidaException {
        if (dados != null) {
            dados = dados.substring(1, dados.length() - 1);
            String aux[] = dados.split(">,<"), aux2[];
            HashMap<String, String> c = new HashMap<String, String>();
            for (int i = 0; i < aux.length; i++) {
                aux2 = aux[i].split("=");
                c.put(aux2[0], aux2[1]);
            }
            Locacao locacao = new Locacao();
            locacao.setCodigo(Integer.parseInt(c.get("codigo")));
            locacao.setDataSaida(c.get("dataSaida"));
            locacao.setKmSaida(Long.parseLong(c.get("kmSaida")));
            locacao.setPrevisaoDias(Integer.parseInt(c.get("previsaoDias")));
            locacao.setTipoLocacao(Integer.parseInt(c.get("tipoLocacao")));
            Cliente cliente = DaoCliente.buscarCliente(Integer.parseInt(c.get("cliente")));
            locacao.setCliente(cliente);
            Veiculo veiculo = DaoVeiculo.buscarVeiculo(Integer.parseInt(c.get("veiculo")));
            locacao.setVeiculo(veiculo);
            if (c.get("dataDevolucao") != null && !c.get("dataDevolucao").equals("null")) {
                System.out.println(c.get("dataDevolucao"));
                locacao.setDataDevolucao(c.get("dataDevolucao"));
                locacao.setKmEntrada(Long.parseLong(c.get("kmEntrada")));
                locacao.setValorLocacao(Double.parseDouble(c.get("valorLocacao")));
            }

            return locacao;
        } else {
            throw new ValidaException("A locação não existe, busque novamente");
        }
    }
}
